#ifndef GRAPHICS_GEOMETRY_H
#define GRAPHICS_GEOMETRY_H

#include "base/types.h"

#include "math/types.h"

#include "graphics/basic.h"
#include "graphics/color.h"

namespace graphics {

////a few typedefs to make things more graphics-y 
//typedef math::Vector3 Point; 
//typedef math::Vector3 Normal;
//typedef math::Vector2 TextureCoordinate;
// 
//enum AxisLabel {X =0, Y, Z, W};

enum CubeFace{
    FRONT_FACE = 0,
    BACK_FACE,
    LEFT_FACE, 
    RIGHT_FACE,
    TOP_FACE,
    BOTTOM_FACE,
    FACE_COUNT
};

enum CubeCorner{
    xyz_CORNER = 0,
    xyZ_CORNER,
    xYz_CORNER,
    xYZ_CORNER,
    Xyz_CORNER,
    XyZ_CORNER,
    XYz_CORNER,
    XYZ_CORNER,
    CORNER_COUNT
};
 

struct Vertex {
public:
    Vertex() : point_(0,0,0), normal_(0,0,0) {}
    Vertex(const Point & point, const Normal & normal) : point_(point), normal_(normal) {}
     
    Point point_;
    Normal normal_;

#ifdef DIRECTX_CAPABLE
    static const int32 FVF;
#endif
};

struct RGBAVertex : public Vertex {
public:
    RGBAVertex(const Point & point, const Normal & normal, const ColorRGBA & color) 
        : Vertex(point, normal), color_(color) {}
    ColorRGBA color_;  

#ifdef DIRECTX_CAPABLE
    static const int32 FVF;
#endif
};

struct RGBATexturedVertex : public RGBAVertex {
public:
    RGBATexturedVertex(const Point & point, const Normal & normal, const ColorRGBA & color, TextureCoordinate coords)
        : RGBAVertex(point, normal, color), texture_coordinate_(coords) {}
    
    TextureCoordinate texture_coordinate_;       //texture coordinate

#ifdef DIRECTX_CAPABLE
    static const int32 FVF;
#endif
};
 

} //namespace graphics

#endif //GRAPHICS_GEOMETRY_H